﻿Imports Kirishima16.Net.Twitter.Scraping
Imports System.Reflection
Imports System.Deployment.Application

Module Module1
    Sub Main()
        Dim mainAccount As New TwitterAccount()
        Dim lstSubAccounts As New List(Of TwitterAccount)
        Console.ForegroundColor = ConsoleColor.White
        Dim strVersion As String
        If Not ApplicationDeployment.IsNetworkDeployed Then
            strVersion = My.Application.Info.Version.ToString()
        Else
            Dim version As Version = ApplicationDeployment.CurrentDeployment.CurrentVersion
            strVersion = String.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision)
        End If
        Console.Title = "Twitter Sub Account Sync Tool(暫定コマンドライン版)" + strVersion
        While True
            Console.WriteLine("メインアカウントのユーザー名を入力してください。")
            Console.Write(">")
            mainAccount.UserName = Console.ReadLine()
            Console.WriteLine("メインアカウントのパスワードを入力してください(表示されません)。")
            Console.Write(">")
            Console.ForegroundColor = ConsoleColor.Black
            mainAccount.Password = Console.ReadLine()
            Console.ForegroundColor = ConsoleColor.White
            If String.IsNullOrEmpty(mainAccount.UserName) Or String.IsNullOrEmpty(mainAccount.Password) Then
                Console.WriteLine("入力に不備がありますので再入力してください。")
            Else
                Console.WriteLine("{0}をメインアカウントとして設定しました。", mainAccount.UserName)
                Exit While
            End If
        End While
        Dim intSubAccountNo = 1
        While True
            Dim subAccount As New TwitterAccount()
            Console.WriteLine("サブアカウント{0}のユーザー名を入力してください。", intSubAccountNo)
            Console.Write(">")
            subAccount.UserName = Console.ReadLine()
            Console.WriteLine("サブアカウント{0}のパスワードを入力してください(表示されません)。", intSubAccountNo)
            Console.Write(">")
            Console.ForegroundColor = ConsoleColor.Black
            subAccount.Password = Console.ReadLine()
            Console.ForegroundColor = ConsoleColor.White
            If String.IsNullOrEmpty(subAccount.UserName) Or String.IsNullOrEmpty(subAccount.Password) Then
                Console.WriteLine("入力に不備があります。")
                If (intSubAccountNo > 1) Then
                    Console.Write("再度サブアカウントを追加しますか?[Y:追加する/*:追加しない]")
                    If Not Console.ReadLine().ToUpper().StartsWith("Y") Then
                        Exit While
                    End If
                Else
                    Console.WriteLine("再入力してください。")
                End If
            ElseIf subAccount.UserName = mainAccount.UserName Then
                Console.WriteLine("メインアカウントと同じユーザー名は設定できません。")
                If (intSubAccountNo > 1) Then
                    Console.Write("再度サブアカウントを追加しますか?[Y:追加する/*:追加しない]")
                    If Not Console.ReadLine().ToUpper().StartsWith("Y") Then
                        Exit While
                    End If
                Else
                    Console.WriteLine("再入力してください。")
                End If
            Else
                Dim found As Boolean = False
                For Each account As TwitterAccount In lstSubAccounts
                    If (subAccount.UserName = account.UserName) Then
                        found = True
                    End If
                Next
                If Not found Then
                    lstSubAccounts.Add(subAccount)
                    Console.WriteLine("{0}をサブアカウント{1}に追加しました。", subAccount.UserName, intSubAccountNo)
                    Console.Write("さらにサブアカウントを追加しますか?[Y:追加する/*:追加しない]")
                    If Not Console.ReadLine().ToUpper().StartsWith("Y") Then
                        Exit While
                    End If
                    intSubAccountNo += 1
                Else
                    Console.WriteLine("既存のサブアカウントと同じユーザー名は設定できません。")
                    If (intSubAccountNo > 1) Then
                        Console.Write("再度サブアカウントを追加しますか?[Y:追加する/*:追加しない]")
                        If Not Console.ReadLine().ToUpper().StartsWith("Y") Then
                            Exit While
                        End If
                    Else
                        Console.WriteLine("再入力してください。")
                    End If
                End If
            End If
        End While
        Console.WriteLine("メインアカウントとサブアカウントのフォローの差分をサブアカウントに追加します。")
        Console.WriteLine("フォロー一覧の取得にはなぜか数分かかることがあります。")
        Console.Write("続行しますか?[Y:続行する/D:全解除モード/*:終了]")
        Dim chrMode As Char = Console.ReadLine().ToUpper()(0)
        Select Case chrMode
            Case "Y"c
                Dim twMain As New TwitterClient()
                Dim aryMainFriends As IList(Of TwitterUser)

                Try
                    Console.Write("メインアカウント({0})にログインしています...", mainAccount.UserName)
                    If (twMain.Login(mainAccount.UserName, mainAccount.Password) <> TwitterClient.LoginResult.Success) Then
                        Console.WriteLine("失敗")
                        Console.WriteLine("アプリケーションを終了します。")
                        Console.ReadLine()
                        Exit Sub
                    End If
                    Console.WriteLine("完了")
                    Console.Write("メインアカウント({0})のフォロー一覧を取得しています...", mainAccount.UserName)
                    aryMainFriends = twMain.GetFriends()
                    Console.WriteLine("完了:{0}人", aryMainFriends.Count)
                Catch ex As Exception
                    Console.WriteLine("失敗")
                    Console.WriteLine("アプリケーションを終了します。")
                    Console.Error.WriteLine(ex.ToString())
                    Console.ReadLine()
                    Exit Sub
                End Try
                intSubAccountNo = 1
                For Each subAccount As TwitterAccount In lstSubAccounts
                    Dim twSub As New TwitterClient()
                    Dim arySubFriends As IList(Of TwitterUser) = Nothing
                    Try
                        Console.Write("サブアカウント{0}({1})にログインしています...", intSubAccountNo, subAccount.UserName)
                        If (twSub.Login(subAccount.UserName, subAccount.Password) <> TwitterClient.LoginResult.Success) Then
                            Console.WriteLine("失敗")
                            Console.WriteLine("このアカウントをスキップします。")
                            Continue For
                        End If
                        Console.WriteLine("完了")
                        Console.Write("サブアカウント{0}({1})のフォロー一覧を取得しています...", intSubAccountNo, subAccount.UserName)
                        arySubFriends = twSub.GetFriends()
                        Console.WriteLine("完了:{0}人", arySubFriends.Count)
                    Catch ex As Exception
                        Console.WriteLine("失敗")
                        Console.WriteLine("このアカウントをスキップします。")
                        Console.Error.WriteLine(ex.ToString())
                        Continue For
                    End Try
                    Console.Write("メインアカウント({0})でサブアカウント{1}({2})がフォローされているか調べています...", _
                                  mainAccount.UserName, intSubAccountNo, subAccount.UserName)
                    Dim isFollowedFromMain As Boolean = False
                    For Each userInfo In aryMainFriends
                        If (userInfo.UserName = subAccount.UserName) Then
                            isFollowedFromMain = True
                            Exit For
                        End If
                    Next
                    Console.WriteLine("完了")
                    If (isFollowedFromMain) Then
                        Console.WriteLine("すでにフォローされています。")
                    Else
                        Console.Write("フォローされていないようなのでフォローします...")
                        Try
                            twMain.CreateFriendship(subAccount.UserName)
                            Console.WriteLine("完了")
                        Catch ex As Exception
                            Console.WriteLine("失敗")
                            Console.Error.WriteLine(ex.ToString())
                        End Try
                    End If
                    Console.Write("サブアカウント{1}({2})でメインアカウント({0})がフォローされているか調べています...", _
                        mainAccount.UserName, intSubAccountNo, subAccount.UserName)
                    Dim isFollowedFromSub As Boolean = False
                    For Each userInfo In arySubFriends
                        If (userInfo.UserName = mainAccount.UserName) Then
                            isFollowedFromSub = True
                            Exit For
                        End If
                    Next
                    Console.WriteLine("完了")
                    If (isFollowedFromSub) Then
                        Console.WriteLine("すでにフォローされています。")
                    Else
                        Console.Write("フォローされていないようなのでフォローします...")
                        Try
                            twSub.CreateFriendship(mainAccount.UserName)
                            Console.WriteLine("完了")
                        Catch ex As Exception
                            Console.WriteLine("失敗")
                            Console.Error.WriteLine(ex.ToString())
                        End Try
                    End If
                    Console.Write("メインアカウント({0})でフォローしていてサブアカウント{1}({2})でフォローしていないユーザーを取得しています...", _
                                   mainAccount.UserName, intSubAccountNo, subAccount.UserName)
                    Dim lstDiffUsers As New List(Of TwitterUser)()
                    For Each mainUser As TwitterUser In aryMainFriends
                        If (mainUser.UserName = subAccount.UserName) Then
                            Continue For
                        End If
                        Dim found As Boolean = False
                        For Each subUser As TwitterUser In arySubFriends
                            If (mainUser.UserID.Equals(subUser.UserID)) Then
                                found = True
                                Exit For
                            End If
                        Next
                        If Not found Then
                            lstDiffUsers.Add(mainUser)
                        End If
                    Next
                    Console.WriteLine("完了")
                    Console.WriteLine("{0}人見つかりました。", lstDiffUsers.Count)
                    Dim intDiffNo As Integer = 1
                    For Each user In lstDiffUsers
                        Console.Write("{0}人目の差分({1}/{2})をフォローしています...", intDiffNo, user.UserName, user.DisplayName)
                        Try
                            twSub.CreateFriendship(user)
                            Console.WriteLine("完了")
                        Catch ex As Exception
                            Console.WriteLine("失敗")
                            Console.WriteLine("このユーザーをスキップします。")
                            Console.Error.WriteLine(ex.ToString())
                        End Try
                        intDiffNo += 1
                    Next
                    Console.Write("サブアカウント{0}({1})からログアウトしています...", intSubAccountNo, subAccount.UserName)
                    Try
                        twSub.Logout()
                        Console.WriteLine("完了")
                    Catch ex As Exception
                        Console.WriteLine("失敗")
                        Console.Error.WriteLine(ex.ToString())
                    End Try

                    intSubAccountNo += 1
                Next
                Console.Write("メインアカウント({0})からログアウトしています...", mainAccount.UserName)
                Try
                    twMain.Logout()
                    Console.WriteLine("完了")
                Catch ex As Exception
                    Console.WriteLine("失敗")
                    Console.Error.WriteLine(ex.ToString())
                End Try
            Case "D"c
                Console.WriteLine("このモードでは、サブアカウントのすべてのフォローを解除します。")
                Console.Write("続行しますか?[Y:全解除モードを続する行/*:終了]")
                Dim chrDestroyConfirm As Char = Console.ReadLine().ToUpper()(0)
                Select Case chrDestroyConfirm
                    Case "Y"c
                        For Each subAccount As TwitterAccount In lstSubAccounts
                            Dim twSub As New TwitterClient()
                            Dim arySubFriends As IList(Of TwitterUser) = Nothing
                            Try
                                Console.Write("サブアカウント{0}({1})にログインしています...", intSubAccountNo, subAccount.UserName)
                                If (twSub.Login(subAccount.UserName, subAccount.Password) <> TwitterClient.LoginResult.Success) Then
                                    Console.WriteLine("失敗")
                                    Console.WriteLine("このアカウントをスキップします。")
                                    Continue For
                                End If
                                Console.WriteLine("完了")
                                Console.Write("サブアカウント{0}({1})のフォロー一覧を取得しています...", intSubAccountNo, subAccount.UserName)
                                arySubFriends = twSub.GetFriends()
                                Console.WriteLine("完了:{0}人", arySubFriends.Count)
                            Catch ex As Exception
                                Console.WriteLine("失敗")
                                Console.WriteLine("このアカウントをスキップします。")
                                Console.Error.WriteLine(ex.ToString())
                                Continue For
                            End Try
                            Dim intDestroyNo As Integer = 1
                            For Each user As TwitterUser In arySubFriends
                                Try
                                    Console.Write("{0}人目({1}/{2})をフォロー解除しています...", intDestroyNo, user.UserName, user.DisplayName)
                                    twSub.DestroyFriendship(user)
                                    Console.WriteLine("完了")
                                Catch ex As Exception
                                    Console.WriteLine("失敗")
                                    Console.WriteLine("このユーザーをスキップします。")
                                    Console.Error.WriteLine(ex.ToString())
                                End Try
                                intDestroyNo += 1
                            Next
                            Console.Write("サブアカウント{0}({1})からログアウトしています...", intSubAccountNo, subAccount.UserName)
                            Try
                                twSub.Logout()
                                Console.WriteLine("完了")
                            Catch ex As Exception
                                Console.WriteLine("失敗")
                                Console.Error.WriteLine(ex.ToString())
                            End Try
                        Next
                    Case Else
                        Exit Sub
                End Select
            Case Else
                Exit Sub
        End Select
        Console.WriteLine("すべての処理が完了しました。")
        Console.WriteLine("Enterキーを押すと終了します。")
        Console.ReadLine()
    End Sub
End Module
